home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power Programmierung
/
Power-Programmierung (Tewi)(1994).iso
/
magazine
/
pctchnqs
/
1991
/
number6
/
dynamic.src
< prev
next >
Wrap
Text File
|
1991-11-11
|
1KB
|
38 lines
{ Listing 1: The DMT lookup function }
{ Fn DYNAMIC requires a TypeOf() ptr and a dynamic index,
and returns a method ptr or NIL. }
function Dynamic(VMT: pointer; Index: word): pointer; assembler;
asm
pushf {Windows crashes if you diddle DF}
std {Scan backwards}
mov ax,[Index] {Load the word we're searching for}
les di,[VMT] {es:di points to VMT}
mov di,[es:di+4] {Point to DMT, if any}
@Check: or di,di {Test for DMT existence}
jnz @Exists
mov ax,di {No DMT: Return NIL}
mov dx,di
jmp @Exit
@Exists:
mov cx,[es:di+6] {The length word}
mov bx,cx {Make a copy}
shl bx,1 {Double it: word addressing}
mov si,di {Retain a ptr to the DMT}
lea di,[di+bx+6] {Offset of LAST dynamic index}
repne scasw {Search for a match}
jne @NoMatch
@Match: shl cx,1 {Double the (origin 0) match index}
shl cx,1 {Double again, for dword indexing}
add bx,cx {Add it to the `index list size'}
les ax,[es:si+bx+8] {@DMT+SizeOf(Indices}+SizeOf(Hdr) }
{ +MatchIndex*SizeOf(pointer) }
mov dx,es
jmp @Exit
@NoMatch:
mov di,[es:si] {Offset of parent's DMT}
jmp @Check
@Exit: popf {Give Windows back its DF}
end;